package tributos.dao;

import java.math.BigInteger;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import tributos.interfaces.ContribuinteDao;
import tributos.modelo.Contribuinte;
import tributos.util.HibernateUtil;

public class ContribuinteDaoImpl implements ContribuinteDao{

	@Override
	public void salvar(Contribuinte contribuinte) {
		Session session = HibernateUtil.getSession();
		Transaction t = session.beginTransaction();
		session.save(contribuinte);
		t.commit();	
		session.close();
	}
	
	@Override
	public List<Contribuinte> listarContribuintes(){
		Session session = HibernateUtil.getSession();
		Criteria criteria = session.createCriteria(Contribuinte.class);
		criteria.addOrder(Order.asc("id"));
		List<Contribuinte> contribuintesCarregados = criteria.list();
	    session.close(); 
		return contribuintesCarregados;
	}

	@Override
	public Long totalRegistros() {
		Session session = HibernateUtil.getSession();
		Query query = session.createSQLQuery("select MAX(id_contribuinte) from contribuinte");
		BigInteger numero = (BigInteger) query.uniqueResult();
		session.close();
		return numero.longValue();
	}

	@Override
	public void removerContribuinte(Contribuinte contribuinte) {
		Session session = HibernateUtil.getSession();
		Transaction t = session.beginTransaction();
		session.delete(contribuinte);
		t.commit();
		session.close();
	}

	@Override
	public void atualiarContribuinte(Contribuinte contribuinte) {
		Session session = HibernateUtil.getSession();
		Transaction t = session.beginTransaction();
		session.update(contribuinte);
		t.commit();
		session.close();
	}

	@Override
	public Contribuinte verificaCpfExistente(String cpf) {
		Session session = HibernateUtil.getSession();
		Criteria criterio = session.createCriteria(Contribuinte.class);
		criterio.add(Restrictions.eq("cpf", cpf));
		Contribuinte contribuinte = (Contribuinte) criterio.uniqueResult();
		session.close();
		return contribuinte;
	}

}
